Лабораторная работа №2
Многопоточное программирование. Threading in C#
Задача #4 - Readers-Writers: RWLock VS Mutex
Краткое описание:
Создать хранилище общих данных (например, список), реализующее операции поиска элемента по его значению и вставки элемента.
Реализовать три варианта данного хранилища:
- Хранилище, предполагающее последовательный доступ
- Хранилище, предполагающее параллельный доступ и использующее Mutex-ы
- Хранилище, предполагающее параллельный доступ и использующее элемент ReaderWriterLock
Сравнить время исполнения N операций над хранилищем, задавая различную вероятность операций поиска и изменения, во всех 3-х вариантах.
При этом выводить статистику: сколько было произведено операций поиска и сколько - изменения.
Дополнительное ограничение:
Тестирование параллельного варианта хранилища провести как с использованием пула потоков (ThreadPool), так и без него(создавать потоки вручную). Сравнить результаты.
p.s. Для замеров времени Вы можете использовать Utility.PerfCounter или System.DateTime.Now;
Возможно изменение задачи с читатели-писатели на производители-потребители с буфером. В этом случае сложность задачи повышается на единицу.
Неформальное описание:
Предполагается, что Вы реализуете три класса, в которых реализуете тот или иной доступ к хранилищу, а также отдельный класс для тестирования хранилища.
Возможен, например, такой вариант:
interface IDataBase{
void add(int elem, int pos);
int pos(int elem);
}
class SerialDB:IDataBase
{
List data=new List();
public void add(int elem, int pos){...}
public int pos(int elem){...}
}
class ParallelDB_Mutex:IDataBase{...}
class ParallelDB_RWL:IDataBase{...}
class Testing
{
static void Main()
{
SerialTest(new SerialDB(),0.01,1000);
SerialTest(new ParallelDB_Mutex(),0.01,1000);
ParallelTest(new ParallelDB_Mutex(),0.01,1000);
....
}
//последовательное обращение к хранилищу
//p-вероятность выполнение операции add
//n-общее число операций
static SerialTest(IDataBase db, double p, int n)
{
...
}
//параллельное обращение к хранилищу
//p-вероятность выполнение операции add
static ParallelTest(IDataBase db, double p, int n)
{
//в ручную создаем потоки, в которых с вероятностью p*n выполняем операцию add
//а с вероятностью (1-p)*n - pos
...
}
//параллельное обращение к хранилищу на базе пула потоков
static ParallelPoolTest(IDataBase db, double p){...}
}
Содержание отчета к л.р.:
Исходный код программы (или нескольких версий программы)
Таблица временных замеров для каждого эксперимента со статистикой обращений
Возможные ошибки:
Не-thread-safe реализация подсчета статистики
|